/**
 * 文件名称: report.js
 * 完整存储路径: frontend/static/js/report.js
 * 功能说明:
 *   此文件用于统计报表页面的查询、表头渲染、数据行渲染、分页生成以及报表导出功能。
 *   修改内容包括：
 *     - 在查询前增加参数验证，确保至少选择一个分组和一个统计指标，
 *       同时对支持二级选项或需要输入的字段进行有效性检查，并弹出提示。
 *     - 对查询参数的收集、分页、报表导出等功能保持原有逻辑。
 * 使用说明:
 *   页面通过该脚本收集用户查询条件，调用 /api/analysis/report 接口获取统计数据，
 *   并动态生成报表表头和数据表格。支持分页、导出报表以及查询模式（预设模板与自定义查询）的切换。
 */

// import { getReportQueryParams } from './comboQuery_report.js';

// 配置驱动架构检查 - 延迟到DOMContentLoaded后执行

document.addEventListener("DOMContentLoaded", function () {
  const validParams = [
    "education_id",
    "school",
    "grade",
    "class_name",
    "name",
    "gender",
    "id_card",
  ];
  let currentPage = 1;
  const perPage = 10;
  let latestReportData = null;
  let isLoading = false;

  // 🔧 配置化：动态加载模板选项
  function loadTemplateOptions() {
    const templateSelect = document.getElementById("templateSelect");
    if (!templateSelect) return;
    
    // 清空现有选项（保留第一个默认选项）
    templateSelect.innerHTML = '<option value="">请选择模版</option>';
    
    // 从后端获取模板选项配置
    fetch('/api/config/report-template-options')
      .then(response => response.json())
      .then(data => {
        if (data.success && data.data) {
          // 动态添加模板选项
          data.data.forEach(template => {
            const option = document.createElement('option');
            option.value = template.value;
            option.textContent = template.label;
            templateSelect.appendChild(option);
          });
        } else {
          // 🔧 降级处理：不使用硬编码，而是显示错误信息
          console.warn("获取模板选项配置失败，显示错误信息");
          const option = document.createElement('option');
          option.value = "";
          option.textContent = "配置加载失败，请联系管理员";
          templateSelect.appendChild(option);
        }
      })
      .catch(error => {
        console.error("获取模板选项配置失败:", error);
        // 🔧 错误处理：不使用硬编码，而是显示错误信息
        const option = document.createElement('option');
        option.value = "";
        option.textContent = "配置加载失败，请联系管理员";
        templateSelect.appendChild(option);
      });
  }

  // 页面加载时初始化模板选项
  loadTemplateOptions();

  function showLoading() {
    isLoading = true;
    document.getElementById("loading").style.display = "block";
  }

  function hideLoading() {
    isLoading = false;
    document.getElementById("loading").style.display = "none";
  }


  // 配置驱动架构检查
  if (typeof getReportQueryParams !== "function") {
    const errorMessage = "配置驱动架构错误：getReportQueryParams 函数未定义！必须正确配置模块依赖。";
    console.error("❌ 配置驱动架构错误:", errorMessage);
    // 不抛出错误，而是显示警告，让页面继续加载
    console.warn("⚠️ 继续加载页面，但某些功能可能不可用");
  }

  function validateReportParams() {
    const queryModeEl = document.getElementById("queryMode");
    if (!queryModeEl) {
      alert("查询模式未设置，请检查页面布局");
      return false;
    }
    const mode = queryModeEl.value.trim();
    if (mode === "template") {
      // 预设模板模式：模板下拉框必须选择有效值
      const templateSelect = document.getElementById("templateSelect");
      if (!templateSelect || !templateSelect.value) {
        alert("请选择有效的预设模板");
        return false;
      }
    } else if (mode === "custom") {
      // 自定义查询模式：必须有 advanced_conditions 参数
      const comboConditionsInput = document.getElementById("comboConditions");
      if (!comboConditionsInput) {
        alert("组合查询条件未找到，请检查页面布局");
        return false;
      }
      let conditions = [];
      try {
        if (comboConditionsInput.value.trim() !== "") {
          conditions = JSON.parse(comboConditionsInput.value.trim());
        }
      } catch (e) {
        alert("组合查询条件格式错误");
        return false;
      }
      let hasGroup = false;
      let hasMetric = false;
      // 遍历每个条件，检查字段、运算符、值是否有效
      for (const cond of conditions) {
        if (
          !cond.field ||
          !cond.operator ||
          cond.value === null ||
          cond.value === "" ||
          (Array.isArray(cond.value) && cond.value.length === 0)
        ) {
          alert("请选择二级选项或填写数值或文本");
          return false;
        }
        const role = cond.role ? cond.role.toLowerCase() : "";
        if (role === "group") {
          hasGroup = true;
        }
        if (role === "metric") {
          hasMetric = true;
        }
      }
      if (!hasGroup || !hasMetric) {
        alert("请选择统计指标或分组");
        return false;
      }
    } else {
      alert("无效的查询模式");
      return false;
    }
    return true;
  }

  function renderReportHeader(data) {
    const theadEl = document.getElementById("reportTableHead");
    theadEl.innerHTML = "";
    data.header.forEach((headerRow) => {
      const tr = document.createElement("tr");
      headerRow.forEach((cell) => {
        const th = document.createElement("th");
        th.textContent = cell.text;
        th.colSpan = cell.colspan || 1;
        th.rowSpan = cell.rowspan || 1;
        th.style.cssText = "text-align: center; vertical-align: middle;";
        tr.appendChild(th);
      });
      theadEl.appendChild(tr);
    });
  }

  function renderReportTable(data) {
    const tbodyEl = document.getElementById("reportTableBody");
    tbodyEl.innerHTML = "";
    data.rows.forEach((rowArray) => {
      const tr = document.createElement("tr");
      rowArray.forEach((cellValue, idx) => {
        const td = document.createElement("td");
        if (idx === 0 || idx === rowArray.length - 1) {
          td.textContent = cellValue;
        } else {
          if ((idx - 1) % 2 === 0) {
            td.textContent = cellValue;
          } else {
            td.textContent = `${cellValue}%`;
          }
        }
        td.style.textAlign = "center";
        tr.appendChild(td);
      });
      tbodyEl.appendChild(tr);
    });
  }

  function renderReportPagination(total) {
    const paginationEl = document.getElementById("pagination");
    paginationEl.innerHTML = "";
    const totalPages = Math.ceil(total / perPage);
    for (let i = 1; i <= totalPages; i++) {
      const li = document.createElement("li");
      li.className = `page-item ${i === currentPage ? "active" : ""}`;
      li.innerHTML = `<a class="page-link" href="#">${i}</a>`;
      li.addEventListener("click", function (e) {
        e.preventDefault();
        currentPage = i;
        fetchReportData();
      });
      paginationEl.appendChild(li);
    }
  }

  function fetchReportData(forceUseFormData = false) {
    // forceUseFormData: true表示用户主动查询，优先使用表单数据
    if (isLoading) return;
    showLoading();
    
    console.log("📊 开始获取报表数据, forceUseFormData:", forceUseFormData);
    
    // 优先检查URL中是否有cache_key（来自图表页面跳转）
    const urlParams = new URLSearchParams(window.location.search);
    const cacheKey = urlParams.get('cache_key');
    
    let params;
    if (cacheKey && !forceUseFormData) {
      console.log("🔑 检测到cache_key，使用URL参数:", urlParams.toString());
      params = urlParams;
    } else {
      console.log("📋 使用表单查询参数");
      params = getReportQueryParams() || new URLSearchParams();
      
      // 如果是用户主动查询，清除URL中的cache_key参数
      if (forceUseFormData && cacheKey) {
        console.log("🧹 用户主动查询，清除URL中的cache_key参数");
        const newUrl = new URL(window.location);
        newUrl.searchParams.delete('cache_key');
        newUrl.searchParams.delete('from_chart');
        window.history.replaceState({}, '', newUrl);
      }
    }
    
    params.set("page", currentPage);
    params.set("per_page", perPage);
    
    // 🔧 调试：打印当前参数对象
    console.log("当前参数对象：", params);
    console.log("参数内容：", params.toString());
    fetch(`/api/report/generate?${params.toString()}`)
      .then((response) => {
        if (!response.ok) throw new Error(`HTTP错误 ${response.status}`);
        return response.json();
      })
      .then((data) => {
        if (data.error) throw new Error(data.error);
        latestReportData = data;
        
        console.log("📊 收到报表响应数据:", data);
        console.log("🔑 响应中的cache_key:", data.cache_key);
        
        // 渲染报表数据
        document.getElementById("reportTitle").textContent = data.tableName;
        document.getElementById("reportTimeAnnotation").textContent = data.filterAnnotation;
        renderReportHeader(data);
        renderReportTable(data);
        renderReportPagination(data.total || data.total);
      })
      .catch((error) => {
        console.error("请求失败:", error);
        alert(`查询失败: ${error.message}`);
      })
      .finally(() => hideLoading());
  }

  // 绑定查询按钮事件
  const reportSearchBtn = document.getElementById("reportSearchBtn");
  if (reportSearchBtn) {
    reportSearchBtn.addEventListener("click", () => {
      if (!validateReportParams()) {
        return; // 验证失败则停止查询
      }
      currentPage = 1;
      fetchReportData(true); // 用户主动查询，强制使用表单数据
    });
  }

  const clearBtn = document.getElementById("clearBtn");
  if (clearBtn) {
    clearBtn.addEventListener("click", () => {
      // 清除表单数据
      validParams.forEach((param) => {
        const el = document.getElementById(param);
        if (el) el.value = "";
      });
      document.getElementById("statTime").value = "";
      document.getElementById("reportNameInput").value = "";
      document.getElementById("comboConditions").value = "";
      document.getElementById("advancedQueryContainer").innerHTML = "";
      document.getElementById("queryMode").value = "template";
      document.getElementById("templateSelect").disabled = false;
      document.getElementById("templateSelect").value = "";
      document.getElementById("reportTitle").textContent = "";
      document.getElementById("reportTimeAnnotation").textContent = "";
      document.getElementById("reportTableHead").innerHTML = "";
      document.getElementById("reportTableBody").innerHTML = "";
      document.getElementById("pagination").innerHTML = "";
      
      // 清除URL中的缓存参数
      clearUrlCacheParams();
      console.log("🧹 已清除表单数据和URL缓存参数");
    });
  }

  const templateSelect = document.getElementById("templateSelect");
  if (templateSelect) {
    templateSelect.addEventListener("change", function () {
      if (
        document.getElementById("queryMode").value === "template" &&
        templateSelect.value
      ) {
        currentPage = 1;
        fetchReportData(true); // 用户选择模板，强制使用表单数据
      }
    });
  }

  const queryModeEl = document.getElementById("queryMode");
  if (queryModeEl) {
    queryModeEl.addEventListener("change", function () {
      if (queryModeEl.value === "template") {
        document.getElementById("comboConditions").value = "";
        document.getElementById("templateSelect").disabled = false;
      } else {
        document.getElementById("templateSelect").disabled = true;
        document.getElementById("templateSelect").value = "";
      }
    });
  }

  // 导出报表函数
  function exportReport() {
    if (!latestReportData) {
      alert("请先查询数据再导出");
      return;
    }
    
    // 🔧 调试：打印导出报表按钮被点击
    console.log("导出报表按钮被点击");
    
    const params = getReportQueryParams();
    params.append("export", "true");
    const exportUrl = `/api/report/generate?${params.toString()}`;
    window.location.href = exportUrl;
  }

  const exportReportBtn = document.getElementById("exportReportBtn");
  if (exportReportBtn) {
    exportReportBtn.addEventListener("click", exportReport);
  }

  // 跳转到图表页面 - 优先使用缓存数据
  const toChartBtn = document.getElementById("toChartBtn");
  if (toChartBtn) {
    toChartBtn.addEventListener("click", () => {
      console.log("🎯 点击跳转到图表按钮");
      console.log("📊 latestReportData:", latestReportData);
      
      // 检查是否有最新报表数据和缓存键
      if (latestReportData && latestReportData.cache_key) {
        console.log("✅ 使用缓存数据跳转到图表页面，cache_key:", latestReportData.cache_key);
        window.location.href = `/chart?cache_key=${latestReportData.cache_key}&chart_type=bar`;
      } else {
        console.log("❌ 无缓存数据，使用URL参数跳转到图表页面");
        console.log("📊 latestReportData.cache_key:", latestReportData?.cache_key);
        // 降级到URL参数传递
        const params = getReportQueryParams();
        params.delete("page");
        params.delete("per_page");
        params.append("chart_type", "bar");
        window.location.href = `/chart?${params.toString()}`;
      }
    });
  }
  
  // ========== 工具函数 ==========
  
  /**
   * 清除URL中的缓存相关参数
   */
  function clearUrlCacheParams() {
    const newUrl = new URL(window.location);
    newUrl.searchParams.delete('cache_key');
    newUrl.searchParams.delete('from_chart');
    newUrl.searchParams.delete('from_report');
    window.history.replaceState({}, '', newUrl);
    console.log("🧹 已清除URL缓存参数:", newUrl.toString());
  }

  // ========== 页面初始化时自动查询报表数据 ==========
  
  /**
   * 页面加载时自动检查URL参数并加载报表数据
   */
  function initAutoQuery() {
    try {
      const urlParams = new URLSearchParams(window.location.search);
      const cacheKey = urlParams.get('cache_key');
      const fromChart = urlParams.get('from_chart');
      
      console.log("📊 报表页面初始化检查 - cache_key:", cacheKey, "from_chart:", fromChart);
      
      // 如果有cache_key或其他查询参数，自动执行查询
      if (cacheKey || urlParams.has('query_mode') || urlParams.has('stat_time')) {
        console.log("✅ 检测到查询参数，自动执行报表查询");
        
        // 自动执行查询
        fetchReportData();
      } else {
        console.log("❌ 未检测到查询参数，等待用户手动查询");
      }
    } catch (error) {
      console.error("初始化自动查询失败:", error);
    }
  }
  
  /**
   * 页面卸载前清理工作
   */
  function cleanup() {
    // 注意：这里我们不自动清除缓存参数
    // 让用户可以通过刷新页面重新加载相同的数据
    // 只有在用户主动点击取消按钮时才清除
    console.log("📋 报表页面卸载，保留URL参数以支持刷新重载");
  }
  
  // 绑定页面卸载事件（仅用于日志记录）
  window.addEventListener('beforeunload', cleanup);
  
  // 执行初始化自动查询
  initAutoQuery();
});
